技术 Cypress的Capsense触摸按键与滑条

工作原理就不说了,从cypress的数据手册上可以了解,如果仅仅是为了使用capsense按键与滑条,只需要知道如何用就好了,深入原理不必深究。
这里主要说下如何具体实现capsense按键与滑条。

如何开始设计:

首先要选择需要的芯片,然后下载该芯片的数据手册仔细阅读,配置好开发环境,在对该款芯片的内部资源和开发环境有了一定了解后再开始设计。
由于模拟部分和驱动固件,cypress已经完全集成在芯片里了,用户要做的就只是PCB layout需要的按键与滑条。然后分配到cypress触摸芯片的相应管脚。
关于PCB layout的一些指导,建议仔细阅读cypress的三个文档,这三个文档在cypress官网上都可以下载到,分别是:
Capacitance Sensing - Layout Guidelines for PSoC CapSense - AN2292 (ZH).pdf
CapSense(TM) Best Practices - AN2394 (ZH).pdf
Getting Started with CapSense_ZH_001-78942[3604].pdf
这些文件中讲解了capsense sensor(就是铜皮啦~)的形状建议,布线规则等。其中比较重要的是:

  1. PCB上的capsense区域,正反面要用网格铺铜。
  2. 触摸按键,滑条的形状最好按照推荐的形状尺寸来。
  3. 离CPU的距离尽量短。

最主要的工作:PCB Layout capsense sensor:

可以看到capsense sensor其实就是一块特定形状的铜皮,有些是规则的,有些是不规则的,通过铜皮与周围铺铜地 之间电容的变化来检测手指的触摸。
在Altium Designer中画铜皮有几种办法: 实心区域,铺铜;用放置实心区域的办法,可以做出一些多边形,圆形的铜皮,但是没有办法做出radial slider—-圆形滑条的形状。
仅仅使用按键和条状滑条的时候,用实心区域比较快捷,画圆形滑条只能用铺铜的方法来做cpasense sensor,AD10铺出任意不规则形状的方法,可以百度一下有详细说明。
用实习区域做出规则形状的按键和滑条:

配图即将更新

为了方便原理图和PCB的对接,把capsense 的sensor 铜皮做成了PCB封装,这样从原理图更新到PCB的时候,就直接可以当做一个元件来使用了。当然也可以不这样做,直接在PCB中现画。
圆形滑条要求比较特别,用放置实心区域无法做出那样的形状,只能通过设定keepoutlayer一个形状,然后在编辑PCB时,对该区域进行铺铜。参考网上的设计方案,做了两种形状:

配图即将更新

第一种形状相对于第二种形状,手指将会同时接触到更多的sensor,和条状滑条做成锯齿状的原理一样,增加灵敏度,
上面两个图都是用了10个sensor的,用更少或更多的sensor也是可以的。
圆形滑条的设计在手册中说的不是很多,如果需要参照的话,可以留言给我,或者是推荐下载cypress的一个圆形滑条开发套件的资料,参照那个资料里面的layout,不过资料里的PCB文件是candence格式的,用AD打开可能会显示不正常。套件的名字是:
CY3280-SRM Board 官网上可以下载全套资料。

Sensor对应的NET,以及按键或滑条内嵌LED的技巧:

如果用直接铺了一整块铜皮的方法完成capsense sensor铜皮的绘制,就比较麻烦了,因为是一整块铜,而10个sensor对应不同的网络。当然可以通过设定AD的规则来强制连线,但是毕竟是不符合规则的,由于博主比较钻牛角尖,必须让PCB所有部分符合自己设定的规则,(为了保证正确性,有经验的老手可以无视~)博主的做法是割铜,按照形状用silce polygen pour 分割成10块铜,分别给每块铜设定网络。或者在一开始铺铜的时候就一块一块铺,铺10块。
在按键或者滑条中内嵌一个LED作为指示反馈是很好的做法,但是手册上却没有明确说明到底如何安装这个LED,直接放在toplayer的sensor上的话,根本没办法贴覆盖层,并且会有凸起,手指没办法触摸。从CY3280-SRM板子的layout里,可以看出来,是通过吧LED焊盘放在bottom layer,然后在sensor上开孔的做法来实现的。就如上图中圆形滑条中央的那个设计,这样从背面贴LED,同时光可以从sensor中央透出来,对贴覆盖层和手指触摸完全没有影响。

固件设计:

cypress已经把capsense的驱动封装成函数形式了,举个例子,博主使用的PSOC Desiger开发环境中,配置好capsense模块,编译后直接包含CSD模块的头文件和C文件。通过里面的函数可以得到用数字表示的触摸检测量。这个数值的大小是你在放置CSD模块的时候可以设置的,CSD模块的详细参数都是自己配置的,具体参数意义和实例代码请参照CSD模块的数据手册。
相信阅读过一定Cypress技术资料后,这些调用函数获得触摸检测量的数字值并不难。笔者这里要说的是数据手册上没有的东西:capsense滑条的固件优化。
cypress提供获得触摸参数的函数是:1.CSD_1_wGetRadialPos(1);
提供获得手指移动方向的函数是:2.CSD_1_wGetRadialInc(BYTE bSnsGroup);
仅仅通过判断手指位置来执行操作的话,使用函数1已经足够了,但是如果要通过获得滑动方向,滑动量,来进行控制,仅仅使用函数1或者函数2已经不够了。表面上来看,如果想通过滑动控制,在while(1)中不断调用函数2,获得滑动方向就好了,单实际上仅仅使用函数2获得的控制效果一点也不好,有的时候完全是混乱的,这源于函数2的执行机制,每次调用函数2,实际上芯片执行的操作是:调用函数1,得到当前手指位置,与上一次保存的手指位置比较,确定方向。
使用while不断检测,检测时间根本没办法确定,同样的程序,较快速地从头滑到尾,执行的操作可能只有几次,而很慢地从头滑到尾,却会执行很多次。我们希望的良好的控制体验是:手指放上去,滑动一定距离,手指离开,根据滑动的这段距离来执行相应操作。
这里用一段小程序来解释如何实现良好的控制体验:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
while(1)
{

CSD_1_ScanAllSensors();
CSD_1_UpdateAllBaselines();
pos1=CSD_1_wGetRadialPos(1); //循环开始,检测手指位置。
if(pos1<100) //设定的阈值是100,无手指接触时获得数字是255;<100表示有手指按下。
{
while(pos1<100) //如果有手指接触到滑条,表示开始一次滑动,直到手指离开,一次滑动完成。
{
if(sign==0) //是否是第一次的接触
{ start=pos1;sign=1;} //如果是第一次的接触,就保存当前手指位置作为开始位置,并清除标志
incf=pos1-start; //获得增量
UpdateSliderPosition(incf); //根据这个增量来实时更新显示或者别的操作
CSD_1_ScanAllSensors();
CSD_1_UpdateAllBaselines();
pos1=CSD_1_wGetRadialPos(1); //再次扫描获得手指位置,
}
//跳出循环表示一次滑动完成,这时候incf中保存的数据就是总的增量
sign=0; //第一次接触标志设为0,用于下一次检测首次接触
start=0;
/*完成一次滑动后,根据滑动量,你要执行的操作代码 。。。。。*/
}

使用这样的机制,控制体验非常好,手指接触之后左右移动都可以实时更新显示,同时最后的操作只根据此次滑动的最终量来执行。用在我们的卤素灯亮度调控产品上,效果很好。TFT液晶屏上的进度条随着滑动实时更新,完成一次滑动后,根据设定的值,控制卤素灯亮度。
若有问题,需要帮助,可以留言联系博主,有相关合作项目的,也欢迎留言联系。
博主自己用PSOC这么长时间,觉得用PSOC开发项目真的很快,比用普通单片机的系统设计可以节省一半的时间吧。Cypress的开发套件都很贵,一套要几千元,博主想开发一套廉价的开发套件同时详细写一些开发资料方便大家快速上手PSOC 芯片,有人要么?要的话,博主就开始做,不过国内用cypress芯片的好像比较少,看过这篇文章的都来说下需不需要,也不枉博主写下这些东西啊。